<?php
/**
 * 用户表模型
 */
namespace app\common\model;
use think\Db;
use think\Model;
use think\Request;//请求类
use think\Session;//session类

class User extends Model{
    //指定主键名 系统会自动指定主键id 如果主键不是id名那么则需要像下面一样修改
    protected $pk = 'id';

    // 定义自动完成的属性
    protected $insert = ['lock' => 0];

    /**
     * 定义一对一关联方法  hasOne('关联模型名','外键名','主键名',['模型别名定义'],'join类型');
     */
    public function userinfo() {
        //默认的外键名是  当前模型_id user_id 如果不是就得像下面操作一样 修改外键字段名称
        //如果定义 一对一关联  那么模型Userinfo  也需要对应 定义关联方法
        return $this->hasOne('Userinfo','uid');
    }


    /**
     * 执行登录
     */
    public function send_login() {
        $requst = Request::instance();
        $data = [
            'account' => trim($requst->post('account')),
            'password' => encrypt_password($requst->post('pwd')),
        ];
        //检测用户名是否存在
        $where = ['account'=>$data['account']];
        $obj = $this->where($where)->find();
        if (empty($obj->account)) {
            $this->error = '用户名或密码错误';
            return false;
        }
        if ($obj->password != $data['password']) {
            $this->error = '用户名或密码错误';
            return false;
        }
        Session::set('uid',$obj->id);
        Session::set('username',Db::name('userinfo')->where(['uid'=>$obj->id])->value('username'));
        return true;
    }


    /**
     * 执行注册
     */
    public function send_register () {
        $requst = Request::instance();
        $username = $requst->post('uname');
        $data = [
            'account' => trim($requst->post('account')),
            'password' => encrypt_password($requst->post('pwd')),
            'registime' => time()
        ];
        // save 新增的情况下 是返回 写入的记录数而不是主键ID
        // 获取主键ID 在模型中获取 $this->id(ps:你的主键ID名称) 在模型外获取 实例化模型对象->主键ID名称
        // save 默认的情况下是新增操作 为了好区分 最好 用isUpdate() 方法来区分 当isUpdate(true) 表示更新   isUpdate(false) 表示新增
        if ($this->isUpdate(false)->save($data)) {
            if ($this->id) {
                //写入关联数据
                $userinfoData = [
                    'uid' => $this->id,
                    'username' => $username,
                ];
                $this->isUpdate(false)->userinfo()->save($userinfoData);
                //记录session
                Session::set('uid',$this->id);
                Session::set('username',$data['account']);
                return true;
            } else {
                $this->error = '系统错误,请重试...';
                return false;
            }

        } else {
            //存放错误信息 还是跟tp 3.2.3 一致 依旧放在error属性中
            $this->error = '系统错误,请重试...';
            return false;
        }
    }

    /**
     * 检测用户名是否已被注册
     */
    public function checkAccount ($name) {
        // get() 和 find() 方法返回的是当前模型的对象实例，可以使用模型的方法。
        $obj = $this->get(['account' => $name]);
        if (!empty($obj->account)) {
            $this->error = '该账号已被注册！';
            return false;
        } else {
            return true;
        }
    }


    /**
     * 检测旧密码
     */
    public function check_pwd($pwd) {
        // 注意value和column方法返回的不再是一个模型对象实例，而是单纯的值或者某个列的数组。
        $password = $this->where(['password' => encrypt_password($pwd),'id' => Session::get('uid')])->value('password');
        if ($password) {
            return true;
        } else {
            $this->error = '旧密码错误.^_^';
            return false;
        }
    }

    /**
     * 修改密码
     */
    public function send_editpwd() {
        $request = Request::instance();
        $this->isUpdate(true)->save(['password' => encrypt_password($request->post('newpwd'))],['id'=>Session::get('uid')]);
        return true;
    }

    /**
     * 检测ID的合法性
     * @param $uid
     */
    public function check_id($uid) {
        return $this->get($uid);
    }
}